package com.letv.datastatistics.dao;

import android.content.Context;
import android.text.TextUtils;
import android.util.Log;

import com.letv.datastatistics.DataStatistics;
import com.letv.datastatistics.entity.DTypeActionInfo;
import com.letv.datastatistics.http.HttpEngine;
import com.letv.datastatistics.util.DataConstant;
import com.letv.datastatistics.util.DataUtils;

import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.Properties;

public class DataManager {
    // 字段不上传时，设为该值
    public static final String NOT_UPLOAD = "not_upload";
    public static final int NOT_UPLOAD_INT = -10000;

    /**
     * 上报动作数据
     */
    public void sendDTypeActionInfo(final Context context, final DTypeActionInfo mDTypeActionInfo) {

        ThreadPoolManager.getInstance().executeThreadWithPool(new Runnable() {
            @SuppressWarnings("deprecation")
            @Override
            public void run() {
                StringBuffer sb = new StringBuffer();
                // $1:nettype,上网类型 ex:wifi/3G
                sb.append(DataUtils.getData(DataUtils.getNetType(context)) + "&");
                // $2:uid,乐视网用户id
                sb.append(DataUtils.getData(mDTypeActionInfo.getUid()) + "&");
                // $3:auid,设备id
                sb.append(DataUtils.getData(DataUtils.generateDeviceId(context)) + "&");
                // $4:act,动作码
                sb.append(DataUtils.getData(mDTypeActionInfo.getCode()) + "&");
                // $5:t,时间戳
                sb.append(System.currentTimeMillis() + "&");
                // $6:uuid (did_timestamp)登录时生成的uuid
                sb.append(getUuid(context) + "&");
                // $7:ext,扩展信息cid_pid_vid;134（0或多个扩展信息，扩展信息以;"分号"分隔）
                sb.append(URLEncoder.encode(DataUtils.getData(mDTypeActionInfo.getExtCode())) + "&");
                // $7:statver
                sb.append(DataConstant.STAT_VERSION + "&");
                // $8:app 产品线
                sb.append(DataUtils.getData(mDTypeActionInfo.getPcode()) + "&");
                // $9：appver
                sb.append(DataUtils.getData(DataUtils.getClientVersionName(context)) + "&");
                // adsystem 广告系统
                sb.append(DataUtils.getData(mDTypeActionInfo.getAdsystem()) + "&");
                // rate,码率
                sb.append(DataUtils.getData(mDTypeActionInfo.getRate()));
                if (DataStatistics.getInstance().isDebug()) {
                    Log.d(DataStatistics.TAG, "sendDownloadInfo:" + sb.toString());
                }
                try {
                    String cacheData = DataStatistics.getInstance().getStatDownloadLogUrl() + sb.toString();
                    HttpEngine.getInstance().doHttpGet(context,
                        new StatisCacheBean(cacheData, cacheData, System.currentTimeMillis()));
                } catch (Exception e) {
                    e.printStackTrace();
                    if (DataStatistics.getInstance().isDebug()) {
                        Log.d(DataStatistics.TAG, "sendDTypeActionInfo Exception:" + e.getMessage());
                    }
                }
            }
        });
    }

    /**
     * 上报错误信息
     */
    public void sendErrorInfo(final Context context, final String ptid, final String uuid, final String app,
                              final String appver, final String course, final String act, final String error, final String ext) {

        ThreadPoolManager.getInstance().executeThreadWithPool(new Runnable() {
            @Override
            public void run() {

                StringBuffer sb = new StringBuffer();
                // 播放时间标识
                sb.append(ptid + "&");
                // 播放器生存的第一次播放的唯一标识，登录是生成的唯一标识
                sb.append(uuid + "&");
                // 产品线
                sb.append(app + "&");
                // 产品线版本
                sb.append(appver + "&");
                // 发生状态，播放器错误存在，页面行为缺失
                sb.append(course + "&");
                // 动作码
                sb.append(act + "&");
                // 错误码
                sb.append(error + "&");
                // 扩展字段
                sb.append(ext);
                if (DataStatistics.getInstance().isDebug()) {
                    Log.d(DataStatistics.TAG, "sendErrorInfo:" + sb.toString());
                }
                try {
                    String cacheData = DataStatistics.getInstance().getStatErrorLogUrl() + sb.toString();
                    Log.i("lh", cacheData);
                    HttpEngine.getInstance().doHttpGet(context,
                        new StatisCacheBean(cacheData, cacheData, System.currentTimeMillis()));
                } catch (Exception e) {
                    e.printStackTrace();
                    if (DataStatistics.getInstance().isDebug()) {
                        Log.d(DataStatistics.TAG, "sendErrorInfo Exception:" + e.getMessage());
                    }
                }
            }
        });
    }

    /**
     * 提交出错的统计
     */
    public void submitErrorInfo(Context context, StatisCacheBean mStatisCacheBean) {
        try {
            HttpEngine.getInstance().doHttpGet(context, mStatisCacheBean);
        } catch (Exception e) {
            e.printStackTrace();
            if (DataStatistics.getInstance().isDebug()) {
                Log.d(DataStatistics.TAG, "submitErrorInfo Exception:" + e.getMessage());
            }
        }
    }

    /**
     * @param context
     * @param p1            一级产品线代码 为从0开始的数字 [必填]
     * @param p2            二级产品线代码 已一级产品线代码为前缀，接下来从0开始 [必填]
     * @param ac            动作名称 [必填]
     * @param err           错误代码 [必填]
     * @param pt            播放时长
     * @param ut            Utime: 动作耗时 [必填]
     * @param uid           乐视网用户注册ID [必填]
     * @param uuidTimeStamp 一次播放过程，播放器生成唯一的UUID, 如果一次播放过程出现了切换码率，那么uuid的后缀加1 [必填]
     * @param cid           频道ID [必填]
     * @param pid           专辑ID [必填]
     * @param vid           视频ID [必填]
     * @param vlen          视频时长 [必填]
     * @param retryCount    重试次数，从0开始 比如 第一次失败，第二次成功，那么只有在第二次上报，其中ry=1 如果第一次即成功，那么ry=0
     *                      [必填]
     * @param type          播放类型 [必填]
     * @param vt            播放器的vtype [必填]
     * @param url           视频播放地址 需要URL编码 [必填] [必填]
     * @param ref           播放页来源地址 需要URL编码 [必填]
     * @param py            Property: 播放属性 [必填]
     * @param st            Station：轮播台 String 如果是中文，需要进行URL编码 [选填]
     * @param weid          上报时获取js生成的页面weid [选填]
     * @param pcode         见附表五 目前仅移动上报此参数,其他可以不报 [选填]
     * @param ilu           0是登陆用户,1非登陆用户 [必填]
     * @param ch            渠道号 [选填]
     * @param ap            是否自动播放, 11月14日仅云商务增加是否自动播放，1表示自动播放，0表示非自动播放
     * @param zid           专题id
     * @param lid           直播id
     * @param stc           Stage time-consuming：影响起播的各阶段时长，参见：附表十三：影响起播时长的因素
     * @param prl           pre loading：是否预加载, 0：未预加载 1：预加载 播放动作ac=play时必须上报，其他动作时无需上报
     * @param cdev          CDE version：CDE版本号, 播放动作ac=init时必须上报，其他动作时不上报
     * @param caid          CDE version：CDE App ID：cde为每个app指定的唯一ID, ]播放动作ac=init时必须上报，其他动作时不上报
     * @param ctime         current time：时间戳，单位 毫秒, 播放动作发生时客户端的时间
     * @param pay           0：免费 1：收费视频试看 2：付费观看;(播放动作ac=play时必须上报，其他动作时不上报)
     * @param joint         0：无广告 1：有广告已拼接 2：有广告未拼接;(播放动作ac=play时必须上报，其他动作时不上报)
     * @param ipt           [必填] 0：直接点播 1：连播 2：切换码流
     * @param custid        云视频客户编号
     * @param apprunid      apprunid 在每次启动时生成，且唯一，下次打开时重新生成，标识每一次启动到关闭的会话。
     *                      生成规则：基于web的上报sessionid；非基于web的上报“设备id _ 时间戳”。
     * @category说明： Play 字段名应该严格遵守，不能随意自己增加字段名，上报采用key-value格式
     * 播放日志由播放器分阶段的动作和播放时长构成 播放器每个阶段结束，都要对动作的结果进行上报,
     * 动作码由播放器团队自己维护，一般是简单的英文缩写，比如gslb, init
     * 等等如果失败，需要重试，在成功之后再上报，失败的不用上报 播放日志，只能由播放器上报
     * 播放日志的动作包括卡顿，卡顿时间就是动作时长 播放日志，不包括播放器广告日志，播放器广告日志还是按照原来的规范上报
     * key和value的值都不允许包含 & 符号，如果有包含，要对key/value值进行URL编码
     * 在播放器的第一个动作上报一次环境信息(uuid不带后缀数字)，后续的动作都不需要再重复上报，这样可以缩短上报信息
     * 上报地址：http://dc.letv.com/pl/? 播放日志，只能由播放器上报
     * @author haitian
     */
    public void
    sendPlayInfo(final Context context, final String p1, final String p2, final String ac, final String err,
                 final String pt, final String ut, final String uid, final String uuidTimeStamp, final String cid,
                 final String pid, final String vid, final String vlen, final String retryCount, final String type,
                 final String vt, final String url, final String ref, final String py, final String st,
                 final String weid, final String pcode, final int ilu, final String ch, final int ap,
                 final String zid, final String lid, final String atc, final String stc, final int prl,
                 final String cdev, final String caid, final long ctime, final int pay, final int joint,
                 final int ipt, final String custid, final String apprunid) {
        ThreadPoolManager.getInstance().executeThreadWithPool(new Runnable() {
            @SuppressWarnings("deprecation")
            @Override
            public void run() {

                StringBuffer sb = new StringBuffer();
                // $1:日志版本号
                sb.append("ver=" + DataUtils.getData(DataConstant.STAT_VERSION) + "&");
                // $2 p1:一级产品线代码 为从0开始的数字
//                sb.append("p1=" + DataUtils.getData(DataUtils.getTrimData(p1)) + "&");
                // $3 p2:二级产品线代码 以一级产品线代码为前缀，接下来从0开始
//                sb.append("p2=" + DataUtils.getData(DataUtils.getTrimData(p1 + p2)) + "&");
                // $4 p3 三级产品线代码 平台自定义
//                sb.append("p3=001" + "&");
                sb.append("p1=" + DataStatistics.readProperties("letv.p1") + "&");
                sb.append("p2=" + DataStatistics.readProperties("letv.p2") + "&");
                sb.append("p3=" + DataStatistics.readProperties("letv.p3") + "&");
                // $5 ac 动作名称
                sb.append("ac=" + DataUtils.getData(ac) + "&");
                // $6 err 错误代码
                sb.append("err=" + DataUtils.getData(err) + "&");
                // $7 pt 播放时长
                sb.append("pt=" + DataUtils.getData(pt) + "&");
                // $8 ut 动作耗时
                sb.append("ut=" + DataUtils.getData(ut) + "&");
                // $9 uid 乐视网注册用户ID
                sb.append("uid=" + DataUtils.getData(uid) + "&");
                // $10 lc:(letv cookie) 是用来唯一标识用户的，用户即使用不同的浏览器，lc都是相同的，可以参考flash
                // cookie
                sb.append("lc=-" + "&");
                // $11 auid,设备id
                sb.append("auid=" + DataUtils.getData(DataUtils.generateDeviceId(context)) + "&");
                // $12 uuid:(did_timestamp) 开始播放生成的UUID是 uuid_0
                // 用户切换码率之后，UUID变为：uuid_1
                // 但是在播放器第一个动作上报环境信息的时候，不要带最后一个_和数字 [必填]
                sb.append("uuid=" + DataUtils.getData(uuidTimeStamp) + "&");
                // Net type:上网类型 取值：wifi/4g/3g/2g/pc [必填]
                sb.append("nt=" + DataUtils.getData(DataUtils.getTrimData(DataUtils.getNetType(context))) + "&");
                // $13 cid:视频频道ID 全业务线统一 和大媒资一致
                sb.append("cid=" + replaceStr(DataUtils.getData(cid)) + "&");
                // $14 pid:专辑ID 如果不是专辑 用 - 替代
                sb.append("pid=" + replaceStr(DataUtils.getData(pid)) + "&");
                // $15 vid: 视频ID
                sb.append("vid=" + replaceStr(DataUtils.getData(vid)) + "&");
                // $16 vlen: 视频时长 以秒为单位
                sb.append("vlen=" + DataUtils.getData(vlen) + "&");
                // $17 ch:渠道
                if (!NOT_UPLOAD.equals(ch))
                    sb.append("ch=" + DataUtils.getData(ch) + "&");
                // $18 ry:重试次数，从0开始
                sb.append("ry=" + DataUtils.getData(retryCount) + "&");
                // $19 ty:点播 0，直播 1 ，轮播2
                sb.append("ty=" + DataUtils.getData(type) + "&");
                // $20 vt:播放器的vType
                sb.append("vt=" + DataUtils.getData(vt) + "&");
                // $21 url:视屏播放地址
                sb.append("url=" + URLEncoder.encode(DataUtils.getData(url)) + "&");
                // $22 ref:播放页来源地址
                sb.append("ref=" + URLEncoder.encode(DataUtils.getData(ref)) + "&");
                // $23 pv:Player version: 播放器版本
                sb.append("pv=2.0" + "&");
                // py: Property 播放属性
                // add 5.8 因play上报的app字段是在controller里面不准确，故和action的处理一样放到统计包里
                // glh 2015316 增加非空判断，否则在首次进入播放页的时候空指针
                if (null != py) {
                    StringBuffer sb1 = new StringBuffer(py);
                    sb1.append("&app=" + DataUtils.getData(DataUtils.getClientVersionName(context)));
                    sb.append("py=" + URLEncoder.encode(DataUtils.getData(DataUtils.getTrimData(sb1.toString()))) + "&");// $24
                }
                // $25 Station：轮播台
                sb.append("st=" + URLEncoder.encode(DataUtils.getData(st)) + "&");
                // $26: ilu是否为登录用户 0：登录 1：非登录
                sb.append("ilu=" + (ilu > 0 ? 1 : 0) + "&");
                // $27 pcode
                sb.append("pcode=" + DataUtils.getData(pcode) + "&");
                // $28 上报时获取js生成的页面weid
                sb.append("weid=" + DataUtils.getData(weid) + "&");
                // $29: 随机数
                sb.append("r=" + System.currentTimeMillis() + "&");
                // 是否自动播放
                if (!(NOT_UPLOAD_INT == ap))
                    sb.append("ap=" + ap + "&");
                // 专题id
                if (!NOT_UPLOAD.equals(zid))
                    sb.append("zid=" + replaceStr(DataUtils.getData(DataUtils.getTrimData(zid))) + "&");
                // 直播id
                if (!NOT_UPLOAD.equals(lid))
                    sb.append("lid=" + replaceStr(DataUtils.getData(lid)) + "&");
                if (!NOT_UPLOAD.equals(atc))
                    sb.append("atc=" + DataUtils.getData(atc) + "&");
                // Stage time-consuming：影响起播的各阶段时长，参见：附表十三：影响起播时长的因素
                if (!NOT_UPLOAD.equals(stc))
                    sb.append("stc=" + DataUtils.getData(stc) + "&");
                // pre loading：是否预加载
                if (!(NOT_UPLOAD_INT == prl))
                    sb.append("prl=" + prl + "&");
                // CDE version：CDE版本号
                if (!NOT_UPLOAD.equals(cdev))
                    sb.append("cdev=" + DataUtils.getData(cdev) + "&");
                // CDE App ID：cde为每个app指定的唯一ID
                if (!NOT_UPLOAD.equals(caid))
                    sb.append("caid=" + DataUtils.getData(caid) + "&");
                // 播放动作发生时客户端的时间
                if (!(NOT_UPLOAD_INT == ctime))
                    sb.append("ctime=" + ctime + "&");
                // 0：免费 1：收费视频试看 2：付费观看
                if (!(NOT_UPLOAD_INT == pay))
                    sb.append("pay=" + pay + "&");
                // 0：无广告 1：有广告已拼接 2：有广告未拼接
                if (!(NOT_UPLOAD_INT == joint))
                    sb.append("joint=" + joint + "&");
                // 0：直接点播 1：连播 2：切换码流
                if (!(NOT_UPLOAD_INT == ipt))
                    sb.append("ipt=" + ipt + "&");
                // 云视频客户编号
                if (!NOT_UPLOAD.equals(custid))
                    sb.append("custid=" + DataUtils.getData(custid) + "&");
                // apprunid在每次启动时生成，且唯一，下次打开时重新生成，标识每一次启动到关闭的会话。
                // 生成规则：基于web的上报sessionid；非基于web的上报“设备id _ 时间戳”
                if (!NOT_UPLOAD.equals(apprunid))
                    sb.append("apprunid=" + DataUtils.getData(apprunid));

                if (DataStatistics.getInstance().isDebug()) {
                    Log.d(DataStatistics.TAG, "sendPlayInfo:" + sb.toString());
                }
                try {
                    String cacheData = DataStatistics.getInstance().getStatPlayerUrl() + sb.toString();
                    HttpEngine.getInstance().doHttpGet(context,
                        new StatisCacheBean(cacheData, cacheData, System.currentTimeMillis()));
                } catch (Exception e) {
                    e.printStackTrace();
                    if (DataStatistics.getInstance().isDebug()) {
                        Log.d(DataStatistics.TAG, "sendPlayInfo Exception:" + e.getMessage());
                    }
                }
            }
        });
    }

    /**
     * @param context
     * @param p1      一级产品线代码 为从0开始的数字
     * @param p2      二级产品线代码 已一级产品线代码为前缀，接下来从0开始
     * @param pcode
     * @param acode   动作码
     * @param ap      动作属性
     * @param ar      动作动作结果 0：成功 1：失败
     * @param cid     视频频道ID 全业务线统一 和大媒资一致
     * @param pid     专辑ID 如果不是专辑 用 - 替代
     * @param vid     视频ID
     * @param uid     乐视网用户id
     * @param cur_url 当前页面地址
     * @param reid    推荐反馈的随机数 String [推荐结果点击时必须上报]推荐点击动作上报时必填
     * @param area    推荐区域标识 String 会提供两个特定的区域[推荐点击动作上报时必填]
     * @param bucket  推荐的算法策略 Int 推荐组维护 [推荐点击动作上报时必填]
     * @param rank    点击视频在推荐区域的排序 Int 最终要沟通确认 [推荐点击动作上报时必填]
     * @param ilu     是否为登录用户 0：登录 1：非登录
     * @param zid     专辑id 2014-04-30 添加
     * @param lid     直播id 2041-06-03 添加
     * @param time
     * @category说明： Action 字段名应该严格遵守，不能随意自己增加字段名，上报采用key-value格式
     * 动作日志，记录的是用户的行为，比如：下载，评论，共享，收藏 所有业务线使用的日志格式一样，使用业务线代码进行区分
     * 动作包括： 点击，评论，下载，收藏，分享，充值，缴费，后续可以继续扩充
     * 动作码由数据部维护，不可以随意添加动作码，要向数据部申请 搜索、播放不在动作日志范畴，有独立的query
     * log和play log key和value的值都不允许包含 &
     * 符号，如果有包含，要对key/value值进行URL编码 上报地址：http://dc.letv.com/op/?
     * <p/>
     * 2014年4月30日增加
     */
    public void sendActionInfo(final Context context, final String p1, final String p2, final String pcode,
                               final String acode, final String ap, final String ar, final String cid, final String pid, final String vid,
                               final String uid, final String cur_url, final String area, final String bucket, final String rank,
                               final int ilu, final String zid, final String lid, final String time, final String reid,
                               final String cms_num, final String targetUrl) {
        if (DataStatistics.getInstance().isDebug()) {
            Log.d(DataStatistics.TAG, "acode = " + acode + " ap =" + ap + " ,vid=" + vid + " ,cid=" + cid + " ,lid="
                + lid + " ,nt=" + DataUtils.getNetType(context));
        }
        ThreadPoolManager.getInstance().executeThreadWithPool(new Runnable() {
            @Override
            public void run() {
                sendActionInfoSub(context, p1, p2, pcode, acode, ap, ar, cid, pid, vid, uid, cur_url, area, bucket,
                    rank, ilu, zid, lid, time, reid, cms_num, targetUrl, false);
            }
        });
    }

    /**
     * 来源M站上报统计
     *
     * @param context
     * @param p1
     * @param p2
     * @param pcode
     * @param fl
     * @param wz
     * @param name
     * @param pageid
     * @param app
     */
    public void sendActionInfo(final Context context, final String p1, final String p2, final String pcode,
                               final String fl, final String wz, final String name, final String pageid, final String app) {
        ThreadPoolManager.getInstance().executeThreadWithPool(new Runnable() {
            @SuppressWarnings("deprecation")
            @Override
            public void run() {
                StringBuffer sb = new StringBuffer();
                sb.append(DataStatistics.readProperties("letv.p1")+"&");
                sb.append(DataStatistics.readProperties("letv.p2")+"&");
                sb.append(DataStatistics.readProperties("letv.p3")+"&");
                sb.append("fl="+fl+"&");
                sb.append("wz="+wz+"&");
                sb.append("name="+name+"&");
                sb.append("pageid="+pageid+"&");
                sb.append("app="+app);
                if (DataStatistics.getInstance().isDebug()) {
                    Log.d(DataStatistics.TAG, "sendfromInfo:" + sb.toString());
                }
                try {
                    String cacheData = DataStatistics.getInstance().getStatActionUrl() + sb.toString();
                    HttpEngine.getInstance().doHttpGet(context, new StatisCacheBean(cacheData, cacheData, System.currentTimeMillis()));
                } catch (Exception e) {
                    e.printStackTrace();
                    if (DataStatistics.getInstance().isDebug()) {
                        Log.d(DataStatistics.TAG, "sendActionInfoSub Exception:" + e.getMessage());
                    }
                }
            }
        });

    }

    /**
     * @param context
     * @param p1      一级产品线代码 为从0开始的数字
     * @param p2      二级产品线代码 已一级产品线代码为前缀，接下来从0开始
     * @param pcode
     * @param acode   动作码
     * @param ap      动作属性
     * @param ar      动作动作结果 0：成功 1：失败
     * @param cid     视频频道ID 全业务线统一 和大媒资一致
     * @param pid     专辑ID 如果不是专辑 用 - 替代
     * @param vid     视频ID
     * @param uid     乐视网用户id
     * @param cur_url 当前页面地址
     * @param reid    推荐反馈的随机数 String [推荐结果点击时必须上报]推荐点击动作上报时必填
     * @param area    推荐区域标识 String 会提供两个特定的区域[推荐点击动作上报时必填]
     * @param bucket  推荐的算法策略 Int 推荐组维护 [推荐点击动作上报时必填]
     * @param rank    点击视频在推荐区域的排序 Int 最终要沟通确认 [推荐点击动作上报时必填]
     * @param ilu     是否为登录用户 0：登录 1：非登录
     *                <p/>
     *                此方法仅用于推送消息使用， 其他情况禁止调用
     *                <p/>
     *                增加 lid zid by king
     * @category说明： Action 字段名应该严格遵守，不能随意自己增加字段名，上报采用key-value格式
     * 动作日志，记录的是用户的行为，比如：下载，评论，共享，收藏 所有业务线使用的日志格式一样，使用业务线代码进行区分
     * 动作包括： 点击，评论，下载，收藏，分享，充值，缴费，后续可以继续扩充
     * 动作码由数据部维护，不可以随意添加动作码，要向数据部申请 搜索、播放不在动作日志范畴，有独立的query
     * log和play log key和value的值都不允许包含 &
     * 符号，如果有包含，要对key/value值进行URL编码 上报地址：http://dc.letv.com/op/?
     */
    public void sendPushActionInfo(final Context context, final String p1, final String p2, final String pcode,
                                   final String acode, final String ap, final String ar, final String cid, final String pid, final String vid,
                                   final String uid, final String cur_url, final String area, final String bucket, final String rank,
                                   final int ilu, final String lid, final String zid) {// 此方法仅用于推送消息使用，其他情况禁止调用
        sendActionInfoSub(context, p1, p2, pcode, acode, ap, area, cid, pid, vid, uid, cur_url, area, bucket, rank,
            ilu, zid, lid, NOT_UPLOAD, NOT_UPLOAD, NOT_UPLOAD, NOT_UPLOAD, true);
    }

    @SuppressWarnings("deprecation")
    public void sendActionInfoSub(final Context context, final String p1, final String p2, final String pcode,
                                  final String acode, final String ap, final String ar, final String cid, final String pid, final String vid,
                                  final String uid, final String cur_url, final String area, final String bucket, final String rank,
                                  final int ilu, final String zid, final String lid, final String time, final String reid,
                                  final String cms_num, final String targetUrl, boolean isPush) {
        StringBuffer sb = new StringBuffer();
        sb.append("ver=" + DataUtils.getData(DataConstant.STAT_VERSION) + "&");// $1:日志版本号
        // p1:一级产品线代码为从0开始的数字
//        sb.append("p1=" + DataUtils.getData(DataUtils.getTrimData(p1)) + "&");// $2
        // p2:二级产品线代码已一级产品线代码为前缀，接下来从0开始
//        sb.append("p2=" + DataUtils.getData(DataUtils.getTrimData(p1 + p2)) + "&");// $3
//        sb.append("p3=001&"); // p3
        sb.append("p1=" + DataStatistics.readProperties("letv.p1") + "&");
        sb.append("p2=" + DataStatistics.readProperties("letv.p2") + "&");
        sb.append("p3=" + DataStatistics.readProperties("letv.p3") + "&");
        sb.append("acode=" + acode + "&");// $5 acode:动作码
        // ap:动作属性, Add app 5.6 ap=URLEncoder.encode(fl=1&wz=1&name=91助手)
        StringBuffer sb1 = new StringBuffer(ap);
        sb1.append("&app=" + DataUtils.getData(DataUtils.getClientVersionName(context)));
        sb.append("ap=" + URLEncoder.encode(DataUtils.getData(DataUtils.getTrimData(sb1.toString()))) + "&");// $6
        // ar:动作动作结果, 0：成功, 1：失败
        sb.append("ar=" + DataUtils.getData(DataUtils.getTrimData(ar)) + "&");// $7
        // cid:视频频道ID, 全业务线统一, 和大媒资一致
        sb.append("cid=" + replaceStr(DataUtils.getData(cid)) + "&");// $8
        // pid:专辑ID, 如果不是专辑 用- 替代
        sb.append("pid=" + replaceStr(DataUtils.getData(pid)) + "&");// $9
        // 视频ID
        sb.append("vid=" + replaceStr(DataUtils.getData(vid)) + "&");// $10
        // uid,乐视网用户id
        sb.append("uid=" + DataUtils.getData(uid) + "&"); // $11
        // uuid:(did_timestamp)
        sb.append("uuid=" + DataUtils.getData(getUuid(context)) + "&"); // $12
        // Nettype:上网类型, 取值：wifi/4g/3g/2g/pc[必填]
        sb.append("nt=" + DataUtils.getData(DataUtils.getTrimData(DataUtils.getNetType(context))) + "&");
        // 是用来唯一标识用户的，用户即使用不同的浏览器， lc都是相同的，可以参考flash cookie, 主要给 PC 端使用，移动、TV 传 -
        sb.append("lc=-" + "&"); // $13 lc:(letv cookie)
        // cur_url:当前页面地址
        sb.append("cur_url=" + URLEncoder.encode(DataUtils.getData(cur_url)) + "&"); // $14
        // $15 ch:渠道
        sb.append("ch=-" + "&");
        // pcode
        sb.append("pcode=" + DataUtils.getData(pcode) + "&");// $16
        // auid,设备id
        sb.append("auid=" + DataUtils.getData(DataUtils.generateDeviceId(context)) + "&"); // $17

        // ilu是否为登录用户, 0：登录 1：非登录
        if (ilu == -1 && !isPush) {
            sb.append("ilu=-" + "&");
        } else {
            sb.append("ilu=" + (ilu > 0 ? 1 : 0) + "&"); // $18:
        }
        // 推荐反馈的随机数, [推荐结果点击时必须上报]推荐点击动作上报时必填
        if (!NOT_UPLOAD.equals(reid))
            sb.append("reid=" + DataUtils.getData(reid) + "&");
        else
            sb.append("reid=" + System.currentTimeMillis() + "&"); // $19
        // 推荐区域标识, 会提供两个特定的区域[推荐点击动作上报时必填]
        sb.append("area=" + DataUtils.getData(area) + "&"); // $20
        // 推荐的算法策略, 推荐组维护[推荐点击动作上报时必填]
        sb.append("bucket=" + DataUtils.getData(bucket) + "&"); // $21
        // 点击视频在推荐区域的排序, 最终要沟通确认 [推荐点击动作上报时必填]
        sb.append("rank=" + DataUtils.getData(rank) + "&"); // $22 rank
        // 专题id
        if (!NOT_UPLOAD.equals(zid))
            sb.append("zid=" + replaceStr(DataUtils.getData(DataUtils.getTrimData(zid))) + "&");
        // 直播id
        if (!NOT_UPLOAD.equals(lid))
            sb.append("lid=" + DataUtils.getData(DataUtils.getTrimData(lid)) + "&"); // $23:
        if (!NOT_UPLOAD.equals(time))
            sb.append("time" + DataUtils.timeClockString("yyyyMMdd_hh:mm:ss") + "&");
        if (!NOT_UPLOAD.equals(cms_num))
            sb.append("cms_num=" + DataUtils.getData(cms_num) + "&");
        if (!NOT_UPLOAD.equals(targetUrl))
            sb.append("targeturl=" + DataUtils.getData(DataUtils.getTrimData(targetUrl)) + "&");
        // 随机数
        sb.append("r=" + System.currentTimeMillis()); // $23: 随机数

        if (DataStatistics.getInstance().isDebug()) {
            Log.d(DataStatistics.TAG, "sendActionInfoSub:" + sb.toString());
        }
        try {
            String cacheData = DataStatistics.getInstance().getStatActionUrl() + sb.toString();
            HttpEngine.getInstance().doHttpGet(context,
                new StatisCacheBean(cacheData, cacheData, System.currentTimeMillis()));
        } catch (Exception e) {
            e.printStackTrace();
            if (DataStatistics.getInstance().isDebug()) {
                Log.d(DataStatistics.TAG, "sendActionInfoSub Exception:" + e.getMessage());
            }
        }
    }

    /**
     * @param context
     * @param p1      一级产品线代码 为从0开始的数字
     * @param p2      二级产品线代码 已一级产品线代码为前缀，接下来从0开始
     * @param pcode
     * @param cid     视频频道ID 全业务线统一 和大媒资一致
     * @param pid     专辑ID 如果不是专辑 用 - 替代
     * @param vid     视频ID
     * @param uid     乐视网用户id
     * @param ref     页面来源 String 要进行URL编码[必填]
     * @param ct      来源类型 1：直接输入，2：站内， 3：搜索，4：站外，5：合作
     * @param rcid    来源频道 String 全业务线统一[必填]
     * @param kw      搜索关键字 String 需要URL编码，如果不是搜索结果页，那么用 – 代替 [必填]
     * @param cur_url 当前页面地址 String 要进行URL编码 [必填]
     * @param area    区域 String 当前页面是由哪个区域点击过来的[选填]
     * @param weid    用户每打开一个页面js随机生成一个webeventid,保证每个页面id唯一即可,同时页面有播放器时将此参数传递给播放器,
     *                如果一个页面有多个播放器,那么要将这个传递给多个播放器..建议可以使用毫秒数生成id[必填]
     * @param ilu     Is login user：是否为登录用户 0：是登录用户 1：非登录用户 [必填]
     * @param zid     专题id String 2014年4月30日增加
     * @category:说明 PV 各业务线视需求不同，灵活掌握是否上报 PV 日志 PV日志主要用于统计、分析视频曝光相关的数据
     * PV日志包括用户信息、设备信息、视频信息 key和value的值都不允许包含 &
     * 符号，如果有包含，要对key/value值进行URL编码 上报地址：http://dc.letv.com/pgv/?
     * <p/>
     * 2014-04-30 所有统计增加zid字段
     */
    public void sendPVInfo(final Context context, final String p1, final String p2, final String pcode,
                           final String cid, final String pid, final String vid, final String uid, final String ref, final String ct,
                           final String rcid, final String kw, final String cur_url, final String area, final String weid,
                           final int ilu, final String zid) {
        ThreadPoolManager.getInstance().executeThreadWithPool(new Runnable() {
            @SuppressWarnings("deprecation")
            @Override
            public void run() {

                StringBuffer sb = new StringBuffer();
                // 日志版本号
                sb.append("ver=" + DataUtils.getData(DataConstant.STAT_VERSION) + "&");// $1:
                // p1:一级产品线代码为从0开始的数字
//                sb.append("p1=" + DataUtils.getData(DataUtils.getTrimData(p1)) + "&");// $2
                // p2:二级产品线代码, 以一级产品线代码为前缀，接下来从0开始
//                sb.append("p2=" + DataUtils.getData(DataUtils.getTrimData(p1 + p2)) + "&");// $3
//                sb.append("p3=001" + "&");// $4 p3 三级产品线代码 平台自定义
                // cid:视频频道ID, 全业务线统一和大媒资一致
                sb.append("p1=" + DataStatistics.readProperties("letv.p1") + "&");
                sb.append("p2=" + DataStatistics.readProperties("letv.p2") + "&");
                sb.append("p3=" + DataStatistics.readProperties("letv.p3") + "&");
                sb.append("cid=" + replaceStr(DataUtils.getData(cid)) + "&");// $5
                // 专辑ID, 如果不是专辑 用- 替代
                sb.append("pid=" + replaceStr(DataUtils.getData(pid)) + "&");// $6
                // 视频ID
                sb.append("vid=" + replaceStr(DataUtils.getData(vid)) + "&");// $7
                // uid,乐视网用户id
                sb.append("uid=" + DataUtils.getData(uid) + "&"); // $8
                // uuid:(did_timestamp)
                sb.append("uuid=" + DataUtils.getData(getUuid(context)) + "&"); // $9
                // 是用来唯一标识用户的，用户即使用不同的浏览器，lc都是相同的，可以参考flash cookie主要给 PC 端使用，移动、TV 传 -
                sb.append("lc=-" + "&"); // $10 lc:(letv cookie)
                // ref:页面来源
                sb.append("ref=" + URLEncoder.encode(DataUtils.getData(ref)) + "&"); // $11
                // 来源类型, 1：直接输入，2：站内，3：搜索，4：站外，5：合作
                sb.append("ct=" + DataUtils.getData(ct) + "&"); // $12 ct:
                // 来源频道
                sb.append("rcid=" + DataUtils.getData(rcid) + "&"); // $13 rcid:

                // 搜索关键字, 需要URL编码，如果不是搜索结果页，那么用–代替
                sb.append("kw=" + URLEncoder.encode(DataUtils.getData(kw)) + "&"); // $14
                // cur_url:当前页面地址
                sb.append("cur_url=" + URLEncoder.encode(DataUtils.getData(cur_url)) + "&"); // $15

                sb.append("ch=-" + "&");// $16 ch:渠道
                // 推荐区域标识, 会提供两个特定的区域[推荐点击动作上报时必填]
                sb.append("area=" + DataUtils.getData(area) + "&"); // $17 area
                sb.append("pcode=" + DataUtils.getData(pcode) + "&");// $18
                // auid,设备id
                sb.append("auid=" + DataUtils.getData(DataUtils.generateDeviceId(context)) + "&"); // $19
                // ilu是否为登录用户, 0：登录 1：非登录
                sb.append("ilu=" + (ilu > 0 ? 1 : 0) + "&"); // $20:
                // Webeventid, 上报时获取js生成的页面weid
                sb.append("weid=" + DataUtils.getData(weid) + "&");// $21
                if (!NOT_UPLOAD.equals(zid))
                    sb.append("zid=" + replaceStr(DataUtils.getData(DataUtils.getTrimData(zid))) + "&");

                sb.append("r=" + System.currentTimeMillis()); // $22: 随机数

                if (DataStatistics.getInstance().isDebug()) {
                    Log.d(DataStatistics.TAG, "sendPVInfo:" + sb.toString());
                }
                try {
                    String cacheData = DataStatistics.getInstance().getStatPVUrl() + sb.toString();
                    HttpEngine.getInstance().doHttpGet(context,
                        new StatisCacheBean(cacheData, cacheData, System.currentTimeMillis()));
                } catch (Exception e) {
                    e.printStackTrace();
                    if (DataStatistics.getInstance().isDebug()) {
                        Log.d(DataStatistics.TAG, "sendPVInfo Exception:" + e.getMessage());
                    }
                }
            }
        });
    }

    /**
     * @param context
     * @param p1      一级产品线代码 为从0开始的数字
     * @param p2      二级产品线代码 已一级产品线代码为前缀，接下来从0开始
     * @param ip      ip地址
     * @param xh      设备型号
     * @param zid     专题id String 2014年4月30日增加
     * @param lo      经度(longitude) String 2015年6月29日增加(V5.9.5)
     * @param la      纬度(laitude) String 2015年6月29日增加(V5.9.5)
     * @category 说明 env 字段名应该严格遵守，不能随意自己增加字段名，上报采用key-value格式
     * 环境日志是系统信息，比如操作系统名称，版本，终端品牌，型号等等 环境日志在用户的每次登陆上报一次即可，其他时间不用再次上报
     * 比如：用户打开移动客户端，此时上报登录日志，同时也要上报环境日志，在此之后的播放、动作等等均不需要再重复上报环境日志
     * 。再比如：用户在PC端打开浏览器，此时上报环境日志。当需要把用户的环境信息做数据分析，比如统计动作日志需要环境信息，
     * 那么需要用动作日志里面的key 去join 环境日志，移动、TV等有设备ID的业务线可以用 UUID(设备ID_时间)
     * 作为key，来join环境日志 PC 可以用 lc 来join环境日志
     * 4：上报地址：http://dc.letv.com/env/?
     * <p/>
     * 2014-04-30 所有统计增加zid字段
     */
    public void sendEnvInfo(final Context context, final String p1, final String p2, final String ip, final String xh,
                            final String zid, final String lo, final String la) {
        ThreadPoolManager.getInstance().executeThreadWithPool(new Runnable() {
            @SuppressWarnings("deprecation")
            @Override
            public void run() {
                StringBuffer sb = new StringBuffer();
//                sb.append("p1=" + DataUtils.getData(DataUtils.getTrimData(p1)) + "&");
//                sb.append("p2=" + DataUtils.getData(DataUtils.getTrimData(p1 + p2)) + "&");
//                sb.append("p3=001" + "&");
                sb.append("p1=" + DataStatistics.readProperties("letv.p1") + "&");
                sb.append("p2=" + DataStatistics.readProperties("letv.p2") + "&");
                sb.append("p3=" + DataStatistics.readProperties("letv.p3") + "&");
                // 是用来唯一标识用户的，用户即使用不同的浏览器，lc都是相同的，可以参考flash cookie
                sb.append("lc=-" + "&");
                sb.append("uuid=" + DataUtils.getData(getUuid(context)) + "&");

                sb.append("ip=" + DataUtils.getData(ip) + "&");
                sb.append("mac=" + DataUtils.getData(DataUtils.generateDeviceId(context)) + "&");
                // nettype,网络类型(wifi/3g)
                sb.append("nt=" + DataUtils.getData(DataUtils.getNetType(context)) + "&");
                sb.append("os=" + DataUtils.getData(DataUtils.getSystemName()) + "&");
                // 操作系统版本
                sb.append("osv=" + DataUtils.getData(DataUtils.getOSVersionName()) + "&");
                sb.append("app=" + DataUtils.getData(DataUtils.getClientVersionName(context)) + "&");
                // brand,品牌, url编码
                sb.append("bd=" + URLEncoder.encode(DataUtils.getData(DataUtils.getBrandName())) + "&");
                // 设备型号,url编码
                sb.append("xh=" + URLEncoder.encode(DataUtils.getData(xh)) + "&");
                // resolution:设备分辨率
                sb.append("ro=" + DataUtils.getDataEmpty(DataUtils.getNewResolution(context)) + "&");
                // Browser浏览器名称, 由数据部维护字典,（见附表三） [选填]
                sb.append("br=chrome" + "&");
                // 设备型号
                sb.append("ep=" + URLEncoder.encode("model=" + DataUtils.getDataEmpty(DataUtils.getDeviceName())) + "&");
                sb.append("zid=" + replaceStr(DataUtils.getData(DataUtils.getTrimData(zid))) + "&");
                // CPU Clock Speed主频(CPU内核的工作频率，单位：MHZ) int 2015年6月29日增加(V5.9.5)
                sb.append("cs=" + DataUtils.getCurCpuFreq() + "&");
                // wifi标识（名称） String 2015年6月29日增加(V5.9.5)
                sb.append("ssid=" + DataUtils.getData(DataUtils.getTrimData(DataUtils.getConnectWifiSsid(context)))
                    + "&");
                sb.append("lo=" + DataUtils.getData(DataUtils.getTrimData(lo)) + "&");
                sb.append("la=" + DataUtils.getData(DataUtils.getTrimData(la)) + "&");
                // 随机数
                sb.append("r=" + System.currentTimeMillis());
                if (DataStatistics.getInstance().isDebug()) {
                    Log.d(DataStatistics.TAG, "sendEnvInfo:" + sb.toString());
                }
                try {
                    String cacheData = DataStatistics.getInstance().getStatEnvUrl() + sb.toString();
                    HttpEngine.getInstance().doHttpGet(context,
                        new StatisCacheBean(cacheData, cacheData, System.currentTimeMillis()));
                } catch (Exception e) {
                    e.printStackTrace();
                    if (DataStatistics.getInstance().isDebug()) {
                        Log.d(DataStatistics.TAG, "sendEnvInfo Exception:" + e.getMessage());
                    }
                }
            }
        });
    }

    /**
     * @param context
     * @param p1      一级产品线代码 为从0开始的数字
     * @param p2      二级产品线代码 已一级产品线代码为前缀，接下来从0开始
     * @param uid     乐视网用户注册ID String [必填]
     * @param lp      登录属性 String 业务线自己维护，可以存储任何值或者多个值，但是如果包括 &，要进行URL编码 [选填]
     * @param ref     登录来源 String 必须为英文 业务线自己维护取值字典 [选填]
     * @param ts      Timestamp登录时间 String 用秒数来表示[必填]
     * @param pcode   渠道
     * @param st      Status 登录状态 int 0:登录成功 1:退出登录 用户按home键转入后台也算退出登录
     *                通过这个状态，可以计算用户的登录时长 [选填]
     * @param zid     专题id String 2014年4月30日增加
     * @category 说明：login 字段名应该严格遵守，不能随意自己增加字段名，上报采用key-value格式
     * 如果用户从移动App上访问，那么app启动进入首页之后，就要上报一次 如果一天用户N次启动App，就发生N次上报
     * 任何业务线，如果用户点击登录按钮并且登录成功之后，要进行一次上报，此时上报信息要携带用户的乐视网注册ID
     * key和value的值都不允许包含 & 符号，如果有包含，要对key/value值进行URL编码
     * 上报地址：http://dc.letv.com/lg/?
     * <p/>
     * 2014-04-30 所有统计增加zid字段
     */
    public void sendLoginInfo(final Context context, final String p1, final String p2, final String uid,
                              final String lp, final String ref, final String ts, final String pcode, final int st, final String zid) {
        ThreadPoolManager.getInstance().executeThreadWithPool(new Runnable() {
            @SuppressWarnings("deprecation")
            @Override
            public void run() {
                StringBuffer sb = new StringBuffer();
                sb.append("ver=" + DataUtils.getData(DataConstant.STAT_VERSION) + "&");
//                sb.append("p1=" + DataUtils.getData(DataUtils.getTrimData(p1)) + "&");
//                sb.append("p2=" + DataUtils.getData(DataUtils.getTrimData(p1 + p2)) + "&");
//                sb.append("p3=001" + "&");
                sb.append("p1=" + DataStatistics.readProperties("letv.p1") + "&");
                sb.append("p2=" + DataStatistics.readProperties("letv.p2") + "&");
                sb.append("p3=" + DataStatistics.readProperties("letv.p3") + "&");
                sb.append("uid=" + DataUtils.getData(uid) + "&");
                sb.append("lc=-" + "&");
                sb.append("auid=" + DataUtils.getData(DataUtils.generateDeviceId(context)) + "&");
                sb.append("uuid=" + DataUtils.getData(getUuid(context)) + "&");

                StringBuffer sb1 = new StringBuffer(lp);
                sb1.append("&app=" + DataUtils.getData(DataUtils.getClientVersionName(context)));
                sb.append("lp=" + URLEncoder.encode(DataUtils.getData(sb1.toString())) + "&");

                sb.append("ch=-" + "&");
                sb.append("ref=" + DataUtils.getData(ref) + "&");

                sb.append("ts=" + DataUtils.getData(ts) + "&");
                sb.append("pcode=" + DataUtils.getData(pcode) + "&");
                sb.append("st=" + st + "&");
                sb.append("zid=" + replaceStr(DataUtils.getData(DataUtils.getTrimData(zid))) + "&");
                sb.append("r=" + System.currentTimeMillis());
                if (DataStatistics.getInstance().isDebug()) {
                    Log.d(DataStatistics.TAG, "sendLoginInfo:" + sb.toString());
                }
                try {
                    String cacheData = DataStatistics.getInstance().getStatNewLoginUrl() + sb.toString();
                    HttpEngine.getInstance().doHttpGet(context,
                        new StatisCacheBean(cacheData, cacheData, System.currentTimeMillis()));
                } catch (Exception e) {
                    e.printStackTrace();
                    if (DataStatistics.getInstance().isDebug()) {
                        Log.d(DataStatistics.TAG, "sendLoginInfo Exception:" + e.getMessage());
                    }
                }
            }
        });
    }

    /**
     * @param context
     * @param p1      一级产品线代码 为从0开始的数字
     * @param p2      二级产品线代码 已一级产品线代码为前缀，接下来从0开始
     * @param sid     Search Id：用于标识一次搜索 int [必填]
     * @param ty      上报类型 int 0:搜索结果页 1：搜索结果点击 [必填]
     * @param pos     点击的视频位置 String
     *                [必填]如果上报类型是搜索结果页，那么这个字段记录的是来自上个页面的点击位置；如果上报类型是是搜索结果点击
     *                ，位置是指点击精确搜索结果的第几个,如果第1个上报1,以此类推. 否则 选填
     * @param pid     专辑ID 如果不是专辑 用 - 替代
     * @param vid     视频ID
     * @param cid     视频频道ID 全业务线统一 和大媒资一致
     * @param uid     乐视网用户注册ID String [必填]
     * @param ilu     是否为登录用户 int 0：是登录用户 1：非登录用户 [必填]
     * @param query   query: http开头的查询 url，至少要包括用户搜索关键词 String 要进行URL编码 [必填]
     * @param page    Page: 搜索结果的当前页码 int [必填]
     * @param rt      Result: 搜索结果 String pid_vid_cid,pid_vid_cid
     *                按照搜索结果页展现的顺序，把搜索结果组合成以上格式进行上报，每页搜索结果上报一条
     *                [必填]优先上报pid，以逗号分隔，如果取不到pid上报vid
     * @param zid     专题id String 2014年4月30日增加
     * @category 说明 query 说明： 字段名应该严格遵守，不能随意自己增加字段名，上报采用key-value格式
     * key和value的值都不允许包含 & 符号，如果有包含，要对key/value值进行URL编码
     * 搜索日志包括搜索关键词，用户信息和搜索结果信息 上报地址：http://dc.letv.com/qy/?
     * <p/>
     * 2014-04-30 所有统计增加zid字段
     */
    public void sendQueryInfo(final Context context, final String p1, final String p2, final String sid,
                              final String ty, final String pos, final String pid, final String vid, final String cid, final String uid,
                              final int ilu, final String query, final String page, final String rt, final String zid) {
        ThreadPoolManager.getInstance().executeThreadWithPool(new Runnable() {
            @SuppressWarnings("deprecation")
            @Override
            public void run() {
                StringBuffer sb = new StringBuffer();
                sb.append("ver=" + DataUtils.getData(DataConstant.STAT_VERSION) + "&");
//                sb.append("p1=" + DataUtils.getData(DataUtils.getTrimData(p1)) + "&");
//                sb.append("p2=" + DataUtils.getData(DataUtils.getTrimData(p1 + p2)) + "&");
                sb.append("p1=" + DataStatistics.readProperties("letv.p1") + "&");
                sb.append("p2=" + DataStatistics.readProperties("letv.p2") + "&");
                sb.append("sid=" + DataUtils.getData(sid) + "&");
                sb.append("ty=" + DataUtils.getData(ty) + "&");
                sb.append("pos" + DataUtils.getData(pos) + "&");
                sb.append("clk=" + DataUtils.getData(pid) + "_" + DataUtils.getData(vid) + "_" + DataUtils.getData(cid)
                    + "&");
                sb.append("uid=" + DataUtils.getData(uid) + "&");
                sb.append("uuid=" + DataUtils.getData(getUuid(context)) + "&");
                sb.append("lc=-" + "&");
                sb.append("auid=" + DataUtils.getData(DataUtils.generateDeviceId(context)) + "&");
                sb.append("ch=-" + "&");
                sb.append("ilu=" + (ilu > 0 ? 1 : 0) + "&");
                sb.append("q=" + URLEncoder.encode(DataUtils.getData(query)) + "&");
                sb.append("p=" + DataUtils.getData(page) + "&");
                sb.append("rt=" + DataUtils.getData(rt) + "&");
                if (!NOT_UPLOAD.equals(zid))
                    sb.append("zid=" + replaceStr(DataUtils.getData(DataUtils.getTrimData(zid))) + "&");
                sb.append("r=" + System.currentTimeMillis());
                if (DataStatistics.getInstance().isDebug()) {
                    Log.d(DataStatistics.TAG, "sendQueryInfo:" + sb.toString());
                }
                try {
                    String cacheData = DataStatistics.getInstance().getStatQueryUrl() + sb.toString();
                    HttpEngine.getInstance().doHttpGet(context,
                        new StatisCacheBean(cacheData, cacheData, System.currentTimeMillis()));
                } catch (Exception e) {
                    e.printStackTrace();
                    if (DataStatistics.getInstance().isDebug()) {
                        Log.d(DataStatistics.TAG, "sendQueryInfo Exception:" + e.getMessage());
                    }
                }
            }
        });
    }

    /**
     * @param context
     * @param p1      一级产品线代码 为从0开始的数字
     * @param p2      二级产品线代码 已一级产品线代码为前缀，接下来从0开始
     * @param ac      pv/click int 0:pv; 1:click
     * @param pp      广告属性 String 业务线自己维护，可以存储任何值或者多个值，但是如果包括 &，要进行URL编码 [选填]
     * @param cid     视频频道ID int 全业务线统一，与大媒资保持一致[必填]
     * @param url     当前页面url String 需要url编码[必填]
     * @param slotid  广告位id String [必填]
     * @param adid    广告ID String [必填]
     * @param murl    Material url:素材地址 String [必填]
     * @param uid     乐视网用户的标识 String [必填]
     * @param ref     页面来源 String 要进行URL编码[必填]
     * @param rcid    来源频道 String 全业务线统一[必填]
     * @param pcode   渠道
     * @param ilu     Is login user：是否为登录用户 Int 0：是登录用户 1：非登录用户 [必填]
     * @param zid     专题id String 2014年4月30日增加
     * @category 说明 页面广告 本日志数据只包括页面广告的数据，不包括播放器广告(播放器广告上报标准不变)
     * 本日志规范适用于移动、PC、TV等各个业务线，通过业务线代码区分 key和value的值都不允许包含 &
     * 符号，如果有包含，要对key/value值进行URL编码 上报地址：http://dc.letv.com/pad/?
     * <p/>
     * 2014-04-30 所有统计增加zid字段
     */
    public void sendADNewInfo(final Context context, final String p1, final String p2, final String ac,
                              final String pp, final String cid, final String url, final String slotid, final String adid,
                              final String murl, final String uid, final String ref, final String rcid, final String pcode,
                              final int ilu, final String zid) {
        ThreadPoolManager.getInstance().executeThreadWithPool(new Runnable() {
            @SuppressWarnings("deprecation")
            @Override
            public void run() {
                StringBuffer sb = new StringBuffer();
                sb.append("ver=" + DataUtils.getData(DataConstant.STAT_VERSION) + "&");
//                sb.append("p1=" + DataUtils.getData(DataUtils.getTrimData(p1)) + "&");
//                sb.append("p2=" + DataUtils.getData(DataUtils.getTrimData(p1 + p2)) + "&");
//                sb.append("p3=001" + "&");
                sb.append("p1=" + DataStatistics.readProperties("letv.p1") + "&");
                sb.append("p2=" + DataStatistics.readProperties("letv.p2") + "&");
                sb.append("p3=" + DataStatistics.readProperties("letv.p3") + "&");
                sb.append("ac=" + DataUtils.getData(ac) + "&");
                sb.append("pp=" + URLEncoder.encode(DataUtils.getData(pp)) + "&");
                sb.append("cid=" + replaceStr(DataUtils.getData(cid)) + "&");
                sb.append("url=" + URLEncoder.encode(DataUtils.getData(url)) + "&");
                sb.append("slotid=" + DataUtils.getData(slotid) + "&");
                sb.append("adid=" + DataUtils.getData(adid) + "&");
                sb.append("murl=" + URLEncoder.encode(DataUtils.getData(murl)) + "&");
                sb.append("uid=" + DataUtils.getData(uid) + "&");
                sb.append("uuid=" + DataUtils.getData(getUuid(context)) + "&");
                sb.append("lc=-" + "&");
                sb.append("ref=" + URLEncoder.encode(DataUtils.getData(ref)) + "&");
                sb.append("rcid=" + DataUtils.getData(rcid) + "&");
                sb.append("ch=-" + "&");
                sb.append("pcode=" + DataUtils.getData(pcode) + "&");
                sb.append("auid=" + DataUtils.getData(DataUtils.generateDeviceId(context)) + "&");
                sb.append("ilu=" + (ilu > 0 ? 1 : 0) + "&");
                if (!NOT_UPLOAD.equals(zid))
                    sb.append("zid=" + replaceStr(DataUtils.getData(DataUtils.getTrimData(zid))) + "&");
                sb.append("r=" + System.currentTimeMillis());
                if (DataStatistics.getInstance().isDebug()) {
                    Log.d(DataStatistics.TAG, "sendQueryInfo:" + sb.toString());
                }
                try {
                    String cacheData = DataStatistics.getInstance().getStatNewADUrl() + sb.toString();
                    HttpEngine.getInstance().doHttpGet(context,
                        new StatisCacheBean(cacheData, cacheData, System.currentTimeMillis()));
                } catch (Exception e) {
                    e.printStackTrace();
                    if (DataStatistics.getInstance().isDebug()) {
                        Log.d(DataStatistics.TAG, "sendADNewInfo Exception:" + e.getMessage());
                    }
                }
            }
        });
    }

    /**
     * error 错误码上报
     *
     * @param context
     * @param p1      一级产品线代码 为从0开始的数字
     * @param p2      二级产品线代码 已一级产品线代码为前缀，接下来从0开始
     * @param ac      pv/click int 0:pv; 1:click
     * @param error   错误代码 业务方自己维护 0表示成功, 这个全业务线统一 是否上报错误码及具体上报错误的逻辑由业务方自行决定 [必填]
     * @param cid     视频频道ID int 全业务线统一，与大媒资保持一致[必填]
     * @param pid
     * @param vid     视频id
     * @param src     用于区分不同日志上报的环境来源标识 String 取各日志接口的名称：如播放日志上报的，此字段填写pl，pv日志填写pgv
     *                [选填] 2013年11月28日增加
     * @param ep      错误属性 string
     *                业务线自己维护，可以存储任何值或者多个值，但是必须要进行URL编码，例如：ep上报值为k1=v1&k2
     *                =v2，k1=v1&k2=v2
     *                应该URL编码成：k1%3dv1%26k2%3dv2，也就是上报的内容为：py=k1%3dv1%26k2%3dv2
     * @param zid     String 专题id
     * @category 说明 字段名应该严格遵守，不能随意自己增加字段名，上报采用key-value格式 错误日志是错误相关信息，比如调取接口错误等等
     * 上报地址：http://dc.letv.com/er/?
     */
    public void sendErrorInfo(final Context context, final String p1, final String p2, final String error,
                              final String src, final String ep, final String cid, final String pid, final String vid, final String zid,
                              final String ip) {
        ThreadPoolManager.getInstance().executeThreadWithPool(new Runnable() {
            @SuppressWarnings("deprecation")
            @Override
            public void run() {
                StringBuffer sb = new StringBuffer();
                sb.append("ver=" + DataUtils.getData(DataConstant.STAT_VERSION) + "&");
//                sb.append("p1=" + DataUtils.getData(DataUtils.getTrimData(p1)) + "&");
//                sb.append("p2=" + DataUtils.getData(DataUtils.getTrimData(p1 + p2)) + "&");
//                sb.append("p3=001" + "&");
                sb.append("p1=" + DataStatistics.readProperties("letv.p1") + "&");
                sb.append("p2=" + DataStatistics.readProperties("letv.p2") + "&");
                sb.append("p3=" + DataStatistics.readProperties("letv.p3") + "&");
                sb.append("err=" + DataUtils.getData(DataUtils.getTrimData(error)) + "&");
                sb.append("lc=-" + "&");
                sb.append("auid=" + DataUtils.getData(DataUtils.generateDeviceId(context)) + "&");
                sb.append("ip=" + DataUtils.getData(DataUtils.getTrimData(ip)) + "&");
                sb.append("mac=" + DataUtils.getData(DataUtils.getTrimData(DataUtils.getMacAddress(context))) + "&");
                sb.append("nt=" + DataUtils.getData(DataUtils.getTrimData(DataUtils.getNetType(context))) + "&");
                sb.append("os=" + DataUtils.getData(DataUtils.getTrimData(DataUtils.getSystemName())) + "&");
                sb.append("osv=" + DataUtils.getData(DataUtils.getTrimData(DataUtils.getOSVersionName())) + "&");
                sb.append("app=" + DataUtils.getData(DataUtils.getTrimData(DataUtils.getClientVersionName(context))) + "&");
                sb.append("bd=" + URLEncoder.encode(DataUtils.getData(DataUtils.getTrimData(DataUtils.getBrandName()))) + "&");
                sb.append("xh=phone" + "&");
                sb.append("model=" + DataUtils.getData(DataUtils.getTrimData(DataUtils.getDeviceName())) + "&");
                sb.append("ro=" + DataUtils.getNewResolution(context) + "&");
                sb.append("br=other" + "&");
                sb.append("src=" + DataUtils.getData(DataUtils.getTrimData(src)) + "&");
                String eps;
                if (TextUtils.isEmpty(ep)) {
                    eps = "-" + "&time=" + DataUtils.timeClockString("yyyyMMdd_hh:mm:ss");
                } else {
                    eps = ep + "&time=" + DataUtils.timeClockString("yyyyMMdd_hh:mm:ss");
                }
                sb.append("ep=" + URLEncoder.encode(DataUtils.getData(DataUtils.getTrimData(eps))) + "&");
                sb.append("cid=" + replaceStr(DataUtils.getData(cid)) + "&");
                sb.append("pid=" + replaceStr(DataUtils.getData(pid)) + "&");
                sb.append("vid=" + replaceStr(DataUtils.getData(vid)) + "&");
                sb.append("zid=" + replaceStr(DataUtils.getData(DataUtils.getTrimData(zid))) + "&");
                sb.append("uuid=" + DataUtils.getData(getUuid(context)) + "&");
                sb.append("r=" + System.currentTimeMillis());
                if (DataStatistics.getInstance().isDebug()) {
                    Log.d(DataStatistics.TAG, "sendErrorInfo:" + sb.toString());
                }
                try {
                    String cacheData = DataStatistics.getInstance().getStatErrorLogUrl() + sb.toString();
                    HttpEngine.getInstance().doHttpGet(context,
                        new StatisCacheBean(cacheData, cacheData, System.currentTimeMillis()));
                } catch (Exception e) {
                    e.printStackTrace();
                    if (DataStatistics.getInstance().isDebug()) {
                        Log.d(DataStatistics.TAG, "sendErrorInfo Exception:" + e.getMessage());
                    }
                }
            }
        });
    }

    /**
     * 替换字符
     *
     * @param str
     */
    private String replaceStr(String str) {
        String value = "-";
        if (str == null || str.equals("") || str.equals("0") || str.equals("-1")) {
            return value;
        }
        return str;
    }

    private String getUuid(Context context) {
        String uuid = DataStatistics.getUuid();
        if (TextUtils.isEmpty(uuid)) {
            uuid = DataUtils.getUUID(context);
            DataStatistics.setUuid(uuid);
        }
        return uuid;
    }

}
